home *** CD-ROM | disk | FTP | other *** search
/ Aminet 25 / Aminet 25 (1998)(GTI - Schatztruhe)[!][Jun 1998].iso / Aminet / text / tex / amiweb2c.lha / AmiWeb2c-2.1 / texmf / pastex / rexx / TeX-Server.rexx < prev    next >
Encoding:
OS/2 REXX Batch file  |  1997-02-09  |  8.4 KB  |  338 lines

  1. /*
  2. ** AREXX $VER: TeX-server.rexx 1.44 (22.11.1992)
  3. **
  4. ** This script creates an ARexx port, by the name of
  5. **
  6. **    Port Name = "Start_TeX"
  7. **
  8. ** and waits there for the commands
  9. **
  10. **    - compile <format-file> <TeX-file including-absolute-path>
  11. **      - the filename *must* have an extension.
  12. **      - if <format-file>=='&', use tex'es default format.
  13. **    - quit
  14. **      - exits the server.
  15. **
  16. ** It may be called with one parameter: the name of the public screen
  17. ** (OS 2.0) in which this server runs.
  18. **
  19. ** AUTHORS:
  20. **    April 1991 Jörg Höhle
  21. **    Before     Georg Hessmann
  22. **
  23. ** CHANGES:
  24. **    1992       Andreas Scherer
  25. **
  26. ** NOTES: An `absolute path' is given if you use a volume, device or
  27. **    assign'ed name like TeX_Disk1:, RAM: or TeX:.
  28. **
  29. **    Make virtex resident (ARP or AmigaDOS, depending on your shell), or
  30. **    include it in your shell path. However the default of 'virtex' may be
  31. **    overridden at any time by the ARexx variable virtex (see further below).
  32. **    This has been implemented to be able to switch between smallTeX and
  33. **    BigTeX on the fly.
  34. **
  35. ** BUGS: Does not allow blanks in filenames and directories, because
  36. **    neither ARexx nor TeX are happy with them.
  37. **
  38. ** FILES:
  39. **    Rexx:NameStruc : namestruc is a function, and must stay in REXX:
  40. **                     for now. Sorry about that.
  41. **    Libs:rexxsupport.library
  42. */
  43.  
  44. /*
  45. ** The Name of the Game
  46. */
  47. PORTNAME = "Start_TeX"
  48.  
  49. Options Results
  50.  
  51. Parse Arg PUBSCREEN .
  52. If PUBSCREEN = "" Then
  53.   PUBSCREEN = "Workbench"
  54.  
  55. If ~Show('Libraries','rexxsupport.library') Then
  56.   If ~Addlib('rexxsupport.library',0,-30,0) Then Do
  57.     Say "Konnte 'rexxsupport.library' nicht öffnen!"
  58.     Exit 20
  59.   End
  60.  
  61. /*
  62. ** ARexx V1.10 sets RC to RESULT * 65536 + RESULT2
  63. **       V1.14 and 1.15 set RC to RESULT on a shell command call.
  64. */
  65. Parse Version . REXXVER .
  66. FILTER2 = REXXVER < "V1.14"
  67. /*
  68. ** Say 'ver'REXXVER 'filter 'FILTER2
  69. */
  70.  
  71. Signal On BREAK_C
  72. Signal On BREAK_D
  73.  
  74. FALSE = 0
  75. TRUE = 1
  76.  
  77. Say
  78. Say "        ********************************************************"
  79. Say "        *                                                      *"
  80. Say "        *   Wilkommen zur ARexx - Passauer TeX Schnittstelle   *"
  81. Say "        *                                                      *"
  82. Say "        ********************************************************"
  83.  
  84. Call SetClip("TEXQUERY")
  85.  
  86. Options Prompt "? >"
  87.  
  88. Say
  89. Say "- Öffne Port "PORTNAME"."
  90.  
  91. If ~OpenPort(PORTNAME) Then Do
  92.   Say
  93.   Say "- konnte nicht geöffnet werden!"
  94.   Exit 20
  95. End
  96.  
  97. EMPTY = FALSE
  98.  
  99. /*
  100. ** Main Loop. To begin with we set ERRORCODE to it's default. Later when
  101. ** there are TeX errors an ERRORCODE ~= 0 will suppress the activation of
  102. ** ShowDVI, which we want to be activated in a normal run.
  103. */
  104. ERRORCODE = 0
  105.  
  106. Address 'showdvi' toBack
  107.  
  108. Do Until COMTEX = 'quit'
  109.  
  110.   If ~EMPTY Then Do
  111.     Call SetClip("TEXTIME")
  112.     Say "- Warte auf Befehle (Compile/Quit) für Port "PORTNAME"."
  113.   End
  114.  
  115.   If ERRORCODE = 0 Then
  116.     Address 'showdvi' Activate
  117.  
  118.   Call WaitPkt(PORTNAME)
  119.  
  120.   PACKET = GetPkt(PORTNAME)
  121.   If PACKET == NULL() Then
  122.     EMPTY = TRUE
  123. /*
  124. ** Say "- Received NULL packet."
  125. **
  126. ** ARexx 1.14 and 1.15 tend to send *lots* of NULL packets
  127. */
  128.   Else Do
  129.     EMPTY = FALSE
  130.  
  131.     Parse Value GetArg(PACKET) With COMTEX FORMAT FULLNAME
  132.  
  133.     Call Reply(PACKET,0)
  134.  
  135.     If COMTEX = 'compile' Then Do
  136. /*
  137. ** And now, Server-to-front
  138. */
  139.       Address COMMAND PToFront PUBSCREEN
  140. /*
  141. ** Result:  5: not OS 2.0
  142. **         10: PubScreen not found,
  143. **         15: no Intuition.library.
  144. */
  145.       If '&' ~= Left(FORMAT,1) Then
  146.         FORMAT = '&'||FORMAT
  147.       Else If '&' = FORMAT Then
  148. /*
  149. ** Use virtex default FORMAT
  150. */
  151.         FORMAT = ""
  152.  
  153. /*
  154. ** Beware of blanks (eg RAM DISK:)
  155. */
  156.       FULLNAME = Strip(FULLNAME)
  157.  
  158. /*
  159. ** Make RAM DISK: a special case
  160. */
  161.       If "RAM DISK:" = Upper(Left(FULLNAME,9)) Then
  162.         FULLNAME="RAM:"||SUBSTR(FULLNAME,10)
  163.  
  164. /*
  165. ** KLUDGE: Do NOT accept names with blanks, I could do a better job here
  166. */
  167.       If 0 ~= Index(FULLNAME," ") Then
  168.         Say "- Bitte keine Leerzeichen in Dateinamen :"FULLNAME
  169.       Else Do
  170.         Parse Value NameStruc(FULLNAME) With IVOL IDIR INAME .
  171.  
  172. /*
  173. ** The following four commands produce the respective results from the input
  174. **
  175. **     (TeX:doc/sample.tex) -> (TeX:doc/)
  176. **                             (sample.tex)
  177. **                             (sample)
  178. **                             (TeX:doc/sample)
  179. */
  180.         TEXDIR   = Left(FULLNAME,    IVOL+IDIR)
  181.         NAMEONLY = SubStr(FULLNAME,1+IVOL+IDIR)
  182.         BASEONLY = SubStr(FULLNAME,1+IVOL+IDIR,INAME)
  183.         FULLBASE = Left(FULLNAME,    IVOL+IDIR+INAME)
  184.  
  185.         If 0 = IVOL Then
  186.           Say "- Ein absoluter Pfad muß benutzt werden (z. B. <device|volumename>:...)!"
  187.         Else If SubStr(FULLNAME,1+IVOL+IDIR+INAME,1) ~= "." Then
  188.           Say "- Fehler, Dateiname muß eine Endung .<extension> haben: "FULLNAME
  189.         Else Do
  190.           If ~Exists(FULLNAME) Then
  191.             Say "- Konnte "FULLNAME" nicht finden! Fehlt ein Pfad?"
  192.           Else Do
  193.             Call Delete(FULLBASE||".log")
  194. /*
  195. ** I feel there's no need to delete the .dvi file.
  196. */
  197.  
  198. /*
  199. ** Get TeX or BigTeX
  200. */
  201.             VIRTEX = GetClip("VIRTEX")
  202.             If "" = VIRTEX Then
  203.               VIRTEX = 'virtex'
  204.  
  205.             Say '- Starte 'VIRTEX FORMAT NAMEONLY
  206.             Say '  im Pfad 'TEXDIR
  207.             Call Pragma('directory',TEXDIR)
  208.             Call SetClip("TEXFILE",FULLNAME)
  209.             NOW = TIME('s')
  210.             Call SetClip("TEXTIME",NOW)
  211.  
  212. /*
  213. ** The "< *" is a hack, no ?
  214. */
  215.             Address COMMAND VIRTEX' < * 'FORMAT NAMEONLY
  216.  
  217. /*
  218. ** How can I get rid of the Rexx message "+++ Command returned >=65536"
  219. ** with versions of ARexx <= V1.10 ?
  220. */
  221.             If FILTER2 Then
  222.               ERRORCODE = RC % 65536 /* ARexx V1.10 */
  223.             Else
  224.               ERRORCODE = RC         /* ARexx V1.14, V1.15 */
  225.  
  226. /*
  227. ** Ignore TeX's warning messages like `Overfull \hbox...' and show
  228. ** the document for visual control.
  229. */
  230.             If ERRORCODE <= 5 Then Do
  231.               If ERRORCODE > 0 Then Do
  232.                 Say
  233.                 Say "- Problem beim Übersetzen, Fehlercode "ERRORCODE"."
  234.               End; Else Do
  235.                 Say
  236.                 Say "- "FULLNAME" wurde fehlerfrei übersetzt."
  237.               End;
  238.  
  239. /*
  240. ** Now start the previewer.
  241. */
  242.               If Show('Port','showdvi') Then Do
  243.                 Address "showdvi"
  244.  
  245.                 Options Results
  246.  
  247.                 GetFile
  248.                 LOADEDFILE = RESULT
  249.  
  250.                 GetDir
  251.                 LOADEDDIR = RESULT
  252.  
  253.                 If Right(LOADEDDIR,1)~=':' & Right(LOADEDDIR,1)~='/' THEN
  254.                   LOADEDDIR = LOADEDDIR||'/'
  255.  
  256.                 If TEXDIR = LOADEDDIR & 1 = Index(Upper(LOADEDFILE||".dvi"),Upper(BASEONLY||".dvi")) Then Do
  257.                   Say "- Datei in ShowDVI wird erneuert."
  258.                   LoadAgain
  259.                 End; Else Do
  260.                   Say "- Lade Datei "FULLBASE".dvi in ShowDVI."
  261.                   LoadNew FULLBASE||".dvi"
  262.                 End
  263.  
  264.                 toFront
  265.                 Activate
  266.               End; Else
  267.                 Say "- ShowDVI läuft nicht."
  268.             End; Else Do
  269.               Say
  270.               Say "- Fehler beim Übersetzen, Fehlercode "ERRORCODE"."
  271.               If GetClip("TEXTIME") == NOW & Exists(FULLBASE||".log") Then Do
  272.                 EDITSCRIPT = Word(MyGetEnv("TEXREXXEDIT"),1)
  273.                 If "" = EDITSCRIPT Then
  274.                   EDITSCRIPT = 'TeXedit.rexx'
  275.                 Say "- Starte den Editor für die Datei "FULLNAME" mittels "EDITSCRIPT"."
  276.                 EDITSCRIPT FULLNAME 0
  277.               End
  278.             End
  279.           End /* Exists */
  280.         End   /* !IVOL, "." */
  281.       End     /* !Index */
  282.     End       /* Compile */
  283.   End         /* !NULL() */
  284. End           /* Do */
  285.  
  286. /*
  287. ** Finish
  288. */
  289. Address COMMAND PToFront PUBSCREEN
  290. /*
  291. ** Result:  5: not OS 2.0
  292. **         10: PubScreen not found
  293. **         15: no Intuition.library
  294. */
  295.  
  296. Say "- Beende den Port "PORTNAME
  297. Call ClosePort PORTNAME
  298.  
  299. If PUBSCREEN ~= "Workbench" Then
  300.   Say "  Window wird automatisch geschlossen."
  301. /*
  302. ** Nur mittels des TeX:rexx/TeX-Server-startup Skriptes
  303. */
  304.  
  305. Signal CleanUp
  306.  
  307. BREAK_C:
  308. BREAK_D:
  309. Say
  310. Say "- Abbruchmeldung empfangen."
  311.  
  312. CleanUp:
  313. Call SetClip("TEXFILE")
  314. Call SetClip("TEXTIME")
  315. Call SetClip("TEXQUERY")
  316. Exit
  317.  
  318. MyGetEnv: PROCEDURE
  319. /*
  320. ** when will ARexx supply GetEnv/SetEnv ?
  321. */
  322. Parse Arg NAME
  323.  
  324. If Open(TEMPFILE,"ENV:"||NAME,'r') Then Do
  325.   GIVES = Readln(TEMPFILE)
  326.   Call Close TEMPFILE
  327. End; Else
  328.   GIVES = ""
  329.  
  330. Return GIVES
  331.  
  332. MySetEnv: PROCEDURE
  333. Parse Arg NAME,CONTENT
  334.  
  335. Address COMMAND "SetEnv" NAME CONTENT
  336.  
  337. Return
  338.